/**
 * @file uart_handler.h
 * @brief 串口通信处理模块
 * @version 1.0
 * @date 2023-03-15
 */

#ifndef UART_HANDLER_H
#define UART_HANDLER_H

#include "uart_protocol.h"
#include "common_defs.h"

#ifdef __cplusplus
extern "C" {
#endif

// 默认UART配置
#define DEFAULT_BAUD_RATE 9600
// 使用common_defs.h中的DEFAULT_TIMEOUT_MS
#define DEFAULT_RETRY_COUNT 3
#define DEFAULT_DEBUG_MODE false

// UART配置结构体
typedef struct {
    char device[MAX_PATH_LENGTH];   // 串口设备名，如 /dev/ttyUSB0
    int baud_rate;                  // 波特率
    int data_bits;                  // 数据位
    int stop_bits;                  // 停止位
    char parity;                    // 校验位 N-无校验，O-奇校验，E-偶校验
    int device_fd;                  // 设备文件描述符
    int timeout_ms;                 // 超时时间(毫秒)
    int retry_count;                // 重试次数
    bool debug_mode;                // 调试模式
} UartConfig;

/**
 * @brief 初始化UART处理器
 * 
 * 使用配置参数初始化UART通信，建立串口连接
 * 
 * @param config UART配置参数
 * @return int 成功返回0，失败返回负值
 */
int init_uart_handler(UartConfig* config);

/**
 * @brief 设置串口（基本版本）
 * 
 * @param port 串口设备名
 * @return int 成功返回文件描述符，失败返回错误码
 */
int setup_uart(const char* port);

/**
 * @brief 设置串口（扩展版本）
 * 
 * @param port 串口设备名
 * @param config 串口配置
 * @return int 成功返回文件描述符，失败返回错误码
 */
int setup_uart_ex(const char* port, UartConfig* config);

/**
 * @brief 关闭串口
 * 
 * @param fd 串口文件描述符
 */
void close_uart(int fd);

/**
 * @brief 请求传感器数据
 * 
 * 向传感器发送数据请求命令
 *
 * @param fd 串口文件描述符
 * @return int 成功返回UART_OK，失败返回错误码
 */
int request_sensor_data(int fd);

/**
 * @brief 接收传感器数据
 * 
 * @param fd 串口文件描述符
 * @param data 输出的传感器数据
 * @return int 成功返回UART_OK，失败返回错误码
 */
int receive_data(int fd, SensorData* data);

/**
 * @brief 打印传感器数据
 * 
 * @param data 传感器数据
 */
void dump_sensor_data(const SensorData* data);

#ifdef __cplusplus
}
#endif

#endif /* UART_HANDLER_H */